/*
 * @Description: 用户模块
 * @Author: Yong
 * @Date: 2021-04-23 15:29:54
 * @LastEditTime: 2021-09-10 22:43:03
 */
/**
 * 将vuex的状态值和前端本地缓存绑定，实现vuex的持久化
 */
import { getToken, setToken, removeToken, setTimestamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'

const state = {
    token: getToken(),  // 设置token为共享状态 初始化vuex的时候从缓存中读取
    userInfo: {},       // 用户资料
}

const mutations = {
    /**
     * 设置token
     */
    setToken: function (state, token) {
        // 1.将数据设置给vuex
        state.token = token 
        // 2.同时将数据设置给缓存
        setToken(token)
    },
    
    /**
     * 删除token
     */
    removeToken: function (state) {
        // 1.清除vuex的token
        state.token = null 
        // 2.清除缓存中的token
        removeToken()
    },

    /**
     * 设置用户资料
     */
    setUserInfo: function (state, userInfo) {
        state.userInfo = { ...userInfo } // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
    },

    /**
     * 删除用户资料
     */
    removeUserInfo: function (state) {
        state.userInfo = {}
    },
}

const actions = {
    /**
     * 登录操作
     */
    async login (context, data) {
        const token = await login(data)     // 获取token
        context.commit('setToken', token)   // 设置token
        setTimestamp()                      // 设置token的同时写入当前时间
    },

    /**
     * 登出操作
     */
    logout (context) {
        // 1.删除token-包括sotre、本地缓存
        context.commit('removeToken')
        // 2.删除用户资料
        context.commit('removeUserInfo')
        // 重置路由
        resetRouter() // 重置路由
        // 去设置权限模块下路由为初始状态
        // Vuex子模块怎么调用子模块的action 都没加锁的情况下 可以随意调用
        // 不加命名空间的情况下的 所有的mutations和action都是挂在全局上的 所以可以直接调用
        // 但是加了命名空间的子模块 怎么调用另一个加了命名空间的子模块的mutations
        // 加了命名空间的context指的不是全局的context
        // mutations名称 载荷 payload 第三个参数  { root: true } 调用根级的mutations或者action
        context.commit('permission/setRoutes', [], { root: true })
    },

    /**
     * 获取用户资料
     */
    async getUserInfo (context) {
        // 获取用户基本信息
        const res = await getUserInfo()
        // 获取用户详细信息
        const baseInfo = await getUserDetailById(res.userId)
        // 合并用户信息
        const baseRes = { ...res, ...baseInfo }
        // 设置setUserInfo
        context.commit('setUserInfo', baseRes)
        return baseRes
    }
}


export default {
    namespaced: true,
    state,
    mutations,
    actions
}
